/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package AccesoDatos.Persistencia.Manager;

import AccesoDatos.Persistencia.Entidad.EEditorial;
import LogicaNegocio.Biblioteca.Editorial;
import MainBiblioSoft.BiblioSoft;
import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.persistence.RollbackException;

/**
 * Esta clase en java es el gestor de persistencia
 * de objetos Editorial en la base de datos BiblioSoft.
 *
 * @author sebaxtian
 * Archivo: ManagerEditorial.java
 * @version 1.0
 * Fecha: sáb may  1 21:14:56 COT 2010
 */


public class ManagerEditorial {

    @PersistenceUnit
    private EntityManagerFactory managerFactory;
    private EntityManager entityManager;

    /**
     * Metodo constructor, crea un gestor para la persistencia de Editorial
     * 
     */
    public ManagerEditorial() {
        managerFactory = BiblioSoft.managerFactory;
        entityManager = managerFactory.createEntityManager();
    }

    /**
     * Este metodo se encarga de la persistencia en la entidad Editorial
     * de un objeto Editorial.
     * 
     * @param editorial
     */
    public void crearEditorial(Editorial editorial) throws RollbackException, EntityExistsException {
        entityManager.clear();
        EEditorial entidadEditorial = new EEditorial();
        entidadEditorial.setCodigoeditorial(editorial.getCodigoEditorial());
        entidadEditorial.setNombre(editorial.getNombre());
        entidadEditorial.setPaginaweb(editorial.getPaginaWeb());
        entidadEditorial.setPais(editorial.getPais());
        //persiste el objeto en la entidad
        EntityTransaction transaccion = entityManager.getTransaction();
        try{
        transaccion.begin();
        entityManager.persist(entidadEditorial);
        } catch (EntityExistsException ex) {
            throw ex;
        } finally {
            transaccion.commit();
        }
        entityManager.clear();
    }

    /**
     * Este metodo actualiza una editorial de la base de datos.
     *
     * @param codigoEditorial
     * @param editorial
     */
    public void actualizarEditorial(int codigoEditorial, Editorial editorial) {
        entityManager.clear();
        EEditorial entidadEditorial;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadEditorial = entityManager.find(EEditorial.class, codigoEditorial);
        transaccion.commit();
        if(entidadEditorial != null){
            entidadEditorial.setCodigoeditorial(editorial.getCodigoEditorial());
            entidadEditorial.setNombre(editorial.getNombre());
            entidadEditorial.setPaginaweb(editorial.getPaginaWeb());
            entidadEditorial.setPais(editorial.getPais());
            transaccion.begin();
            entityManager.merge(entidadEditorial);
            transaccion.commit();
            Query consulta = entityManager.createQuery("UPDATE ELibro e SET e.codigoeditorial = :codigoeditorialnuevo WHERE e.codigoeditorial = :codigoeditorialanterior");
            consulta.setParameter("codigoeditorialnuevo", editorial.getCodigoEditorial());
            consulta.setParameter("codigoeditorialanterior", codigoEditorial);
            transaccion.begin();
            consulta.executeUpdate();
            transaccion.commit();
        }
        entityManager.clear();
    }

    /**
     * Este metodo permite obtener la editorial identificada
     * con el codigo de editorial.
     * Si no se encuentra retorna null
     *
     * @param codigoEditorial
     * @return editorial
     */
    public Editorial obtenerEditorial(int codigoEditorial) {
        entityManager.clear();
        EEditorial entidadEditorial;
        Editorial editorial = null;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadEditorial = entityManager.find(EEditorial.class, codigoEditorial);
        transaccion.commit();
        if(entidadEditorial != null){
            editorial = new Editorial();
            editorial.setCodigoEditorial(entidadEditorial.getCodigoeditorial());
            editorial.setNombre(entidadEditorial.getNombre());
            editorial.setPaginaWeb(entidadEditorial.getPaginaweb());
            editorial.setPais(entidadEditorial.getPais());
        }
        entityManager.clear();
        return editorial;
    }
    
}
